// 引入axios
import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getTimeStamp } from './auth'
import router from '@/router'
const timeOut = 1 * 60 * 60 * 1000 // 设置token时效
// 创建axios实例
const service = axios.create({
  // 如果执行 npm run dev  值为 /api 正确  /api 这个代理只是给开发环境配置的代理
  // 如果执行 npm run build 值为 /prod-api  没关系  运维应该在上线的时候 给你配置上 /prod-api的代理
  // 方法1： 因为要区分开发环境跟生产环境，baseURL不能写死
  baseURL: process.env.VUE_APP_BASE_API,
  // 方法2：baseURL:process.env.NODE_ENV==='production'? '/prod-api' : 'api'
  // 发出去的请求的真实地址 = 跟地址（local host：8888.api）+ 请求路径
  // 如果baseURL没有携带任何的域名，协议，端口，那么默认发出的请求就是localhost
  timeout: 12 * 1000// 定义5秒超时
})

// 给实例添加请求拦截器
service.interceptors.request.use(
  // 成功的回调
  config => {
    // 判断有token再注入token
    if (store.getters.token) {
      // 如果token失效，返回异常,清除token，返回登录状态
      // 超时公式：当前时间 - 记录时间 > 有效时间
      if (+new Date() - getTimeStamp() > timeOut) {
        store.dispatch('user/logout')
        router.push('/login')
        return Promise.reject(new Error('token超时了!')) // 返回响应拦截器的提示错误信息
      }

      config.headers.Authorization = `Bearer ${store.getters.token}`
    }
    return config
  },
  // 失败的回调
  error => {
    return Promise.reject(error)
  }
)

// 给实例添加响应拦截器
service.interceptors.response.use(
  // 成功的回调（接口调成功）
  response => {
    // axios默认加上一层data
    // data其实就是后台返回的真实数据，也是页面需要的数据
    const { success, message, data } = response.data
    // 如果success（业务有没有办理成功）为true，那么返回后台真实拿到的data
    if (success) {
      return data
    } else {
      // 否则提示错误信息，返回失败状态
      Message.error(message)
      return Promise.reject(new Error(message))
    }
  },
  // 失败的回调
  error => {
    // 如果后端返回失败结果的code是否为10002，是就是token失效
    if (error.response.data?.code === 10002) {
      store.dispatch('user/logout')
      router.push('/login')
    } else {
      Message.error(error.message)
    }
    return Promise.reject(error)

    // 统一提示错误信息(不用在页面try catch捕获错误后再提示，一旦发现错误，统一提示)
  }
)

// 导出实例
export default service
